package com.york.oss.service;

import com.york.oss.adapter.StorageAdapter;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 前面传统的方法，就是设计了接口StorageService，不同的实现类就要实现它
 * 然后到时候controller里需要切换比方阿里云比方minio，就得更换不同的service，这样太费事了
 * 于是我们设计适配器的方式，而且添加一个type字段，表示用哪一种方式
 * 这样只要在配置文件里面改这个type即可
 */
@Service
public class FileService {

    /**
     * StorageService中配置了名为storageService的Bean，
     * 是不管类型是哪个但是名字都是storageService，这就保证了对外只是暴露一个storageService，而不考虑背后是谁
     */
    private final StorageAdapter storageAdapter;

    public FileService(StorageAdapter storageAdapter) {
        this.storageAdapter = storageAdapter;
    }

    /**
     * 列出所有桶
     */
    public List<String> getAllBucket() {
        return storageAdapter.getAllBucket();
    }

    /**
     * 获取文件路径
     */
    public String getUrl(String bucketName, String objectName) {
        return storageAdapter.getUrl(bucketName, objectName);
    }


    /**
     * 上传文件
     */
    public String uploadFile(MultipartFile uploadFile, String bucket, String objectName) {
        storageAdapter.uploadFile(uploadFile, bucket, objectName);
        objectName = objectName + "/" + uploadFile.getOriginalFilename();
        return storageAdapter.getUrl(bucket, objectName);
    }
}
